﻿#! -*-coding:utf-8-*-

'''
call command/shell

zhaoxp
'''

import os
import sys
import commands
import subprocess

'''
http://blog.csdn.net/my2010sam/article/details/18315785

os.sysetm() 这个方法只是纯粹的调用命令，返回调用结果，不能得到命令执行的内容结果
  system(command) -> exit_status
  Execute the command (a string) in a subshell.
  
os.popen()
  popen(command [, mode='r' [, bufsize]]) -> pipe
  Open a pipe to/from a command returning a file object.
  
commands
  commands.getstatusoutput(cmd) 返回(status, output)
  commands.getoutput(cmd)       只返回输出结果
  commands.getstatus(file)      返回ls -ld file的执行结果字符串，调用了getoutput，不建议使用此方法
  
 
众方法的比较以及总结
4.1. 关于 os.system 
os.system("some_command with args")将命令以及参数传递给你的系统shell，这很好，因为你可以用这种方法同时运行多个命令并且可以设置管道以及输入输出重定向。比如：
os.system("some_command < input_file | another_command > output_file")
然而，虽然这很方便，但是你需要手动处理shell字符的转义，比如空格等。此外，这也只能让你运行简单的shell命令而且不能运行外部程序。

4.2. 关于os.popen
使用stream = os.popen("some_command with args")也能做与os.system一样的事，与os.system不同的是os.popen会返回一个类文件对象，使用它来访问标准输入、输出。
4.3. 关于subprocess.popen
subprocess模块的Popen类，意图作为os.popen的替代，但是因为其很全面所以比os.popen要显得稍微复杂。
比如你可以使用  print Popen("echo Hello World", stdout=PIPE, shell=True).stdout.read()  来替代  print os.popen("echo Hello World").read()。但是相比之下它使用一个统一的类包括4中不同的popen函数还是不错的。

4.4. 关于subprocess.call
subprocess模块的call函数。它基本上就像Popen类并都使用相同的参数，但是它只简单的等待命令完成并给你返回代码。比如：
return_code = subprocess.call("echo Hello World", shell=True)

os模块中还有C中那样的fork/exec/spawn函数，但是我不建议直接使用它们。subprocess可能更加适合你。
'''
def run_command_nt():
	print "call command in NT"
	status=os.system("echo 你好")
	print "exit_status(你好) =",status
	status=os.system("ver")
	print "exit_status =",status
	
	print '-------------------------------------------------------'
	r=os.popen("echo 你好").read()
	print "echo result(你好)\r\n",r
	r=os.popen("ver").read()
	print "ver result\r\n",r

	print '-------------------------------------------------------'
	status=commands.getstatusoutput("echo 你好")
	print "status =",status
	o=commands.getoutput("echo 你好")
	print "outout =",o

	print '-------------------------------------------------------'
	subprocess.call(["echo","hello"])
	pass
	
def run_shell_unix():
	print "run shell in unix serials"
	pass


if __name__=="__main__":
	print "Show to how call OS command/shell"
	if os.name=='nt':
		run_command_nt()
	elif os.name=='posix':
		run_shell_unix